package com.lipuwater.agent.ble;

import com.blekit.BluetoothClient;
import com.blekit.connect.response.BleWriteResponse;
import com.blekit.utils.ByteUtils;
import com.lipuwater.agent.ble.eventbus.DeviceWriteEvent;
import com.lipuwater.agent.ble.listener.WriteListener;
import com.lipuwater.agent.ui.activity.MainActivity;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import de.greenrobot.event.EventBus;

import static com.blekit.Code.REQUEST_SUCCESS;

/**
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　　┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　　　　　┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃神兽保佑
 * 　　　　┃　　　┃永无BUG！
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━神兽出没━━━━━━
 * Created by  Administrator  on 2016/11/28.
 * Email:924686754@qq.com
 * 设备写入
 */
public class DeviceWrite {
    private UUID WRITE_SERVICE_UUID = UUID.fromString(BleConfig.WRITE_SERVICE_UUID);
    private UUID WRITE_NOTIFICATION_UUID = UUID.fromString(BleConfig.WRITE_NOTIFICATION_UUID);

    private BluetoothClient mClient;
    private WriteListener mWriteListener;
    private String mMac;
    private List<String> datas;
    private int position;

    public DeviceWrite() {
        this.mClient = MainActivity.mBleClient;
    }


    public void writeData(String data, String mac, WriteListener writeListener) {
        this.mWriteListener = writeListener;
        if (mClient == null || data == null || data.equals("")) {
            return;
        }
        this.mMac = mac;
        datas = getDatas(data);
        position = 0;
        write(datas.get(position));//开始写第一包
    }


    private void write(String data) {
        mClient.write(mMac, WRITE_SERVICE_UUID, WRITE_NOTIFICATION_UUID, ByteUtils.stringToBytes(data), new BleWriteResponse() {
            @Override
            public void onResponse(int code) {
                if (code == REQUEST_SUCCESS) {
                    if (datas.size() == position + 1) {
                        //所有数据分包写入完毕
                        EventBus.getDefault().post(new DeviceWriteEvent(true));
                        if (mWriteListener != null) {
                            mWriteListener.onWrite(code);
                        }
                    } else {
                        position++;
                        write(datas.get(position));
                    }
                } else {
                    if (mWriteListener != null) {
                        mWriteListener.onWrite(code);
                    }
                }
            }
        });
    }


    /**
     * 将数据每20个字节分段
     *
     * @param data
     * @return
     */
    private List<String> getDatas(String data) {
        double count = (double) data.length() / 20;
        List<String> counts = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            if (i + 1 >= count) {
                counts.add(data.substring(i * 20, data.length()));
            } else {
                counts.add(data.substring(i * 20, (i + 1) * 20));
            }
        }
        return counts;
    }

}
